/**
 * meeno
 * {components} 工具类方法
 * {author} Petu
 */

var utility =
{
	/* ===================================================
	 * 常用 类
	 * ===================================================
	 */
	/**
    * 判断两个字符串是否相等
    * @param {Object} 字符串1 val1
    * @param {Object} 字符串2 val2
    * @return {Object} boolean
    */
	equal : function (val1, val2)
	{
		var isEqual = false;
	
		try{
			if(val1.toString() == val2.toString()){
				isEqual = true;
			}
		}catch(e){
			isEqual = false;
		}
		
		return isEqual;
	},
	
	/**
    * 过滤违法字符
    * @param {Object} 需要过滤的字符串 str
    * @return {Object} rs
    */
	filterIllegalChar : function (str)
	{
		var pattern = new RegExp("[`~!@#$^&*()=+|{}':;',\\[\\].<>/?~！@#￥……&*（）——|{}【】‘；：”“'。，、？]") 
		var rs = ""; 
		for (var i = 0; i < str.length; i++) 
		{
			rs = rs+str.substr(i, 1).replace(pattern, ''); 
		} 
		return rs; 
	},
	
	/**
    * 过滤中文
    * @param {Object} 需要过滤的字符串 str
    * @return {Object} rs
    */
	filterChinese : function (str)
	{
		var pattern = /^[\u4e00-\u9fa5]/
		var rs = ""; 
		for (var i = 0; i < str.length; i++) 
		{
			rs = rs+str.substr(i, 1).replace(pattern, ''); 
		} 
		return rs;
	},
	
	/**
    * 手机号码隐藏中间四位 表现形式 138****7898
    * @param {Object} 需要转化的手机号 phoneNum
    * @return {Object} fixedPhoneNum
    */
	hidePhoneNum : function (phoneNum)
	{
		var fixedPhoneNum = phoneNum.substr(0,3) + "****" + phoneNum.substr(phoneNum.length-4,4);
		return fixedPhoneNum;
	},
	
	/**
    * 身份证号码私密隐藏 表现形式 3424*******539
    * @param {Object} 需要转化的身份证号 IdCardNum
    * @return {Object} IdCardNum
    */
	hideIdCardNum : function (IdCardNum)
	{
		var fixedIdCardNum = IdCardNum.substring(0,3) + "****" + IdCardNum.substring(14,IdCardNum.length);
		return fixedIdCardNum;
	},
	
	/**
    * 判断一个字符串是否为空
    * @param {Object} 字符串 strVal
    * @return {Object} boolean
    */
	isEmpty : function ()
	{
		var isEmpty = false;
	
		try{
			if(strVal == "" || strVal == "''" || strVal == '' || strVal == "null" || strVal == "{}" || strVal == NaN ||strVal == {} 
			|| strVal == "[]" || strVal == null || strVal == "'[]'" || strVal == "<null>" || strVal == undefined || strVal == []){
				isEmpty = true;
			}
			else {
				isEmpty = false;
			}
		}
		catch(e){
			isEmpty = true;
		}
		
		return isEmpty;
	},
	
	/**
    * 获得url后面所带的参数的值
    * @param {Object} 所带的参数key值 name
    * @return {Object} value
    */
	getQueryString : function (name)
	{
//		//方法一
//      var after = window.location.hash.split("?")[1];
//      if(after)
//      {
//          var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
//          var r = after.match(reg);
//          if(r != null)return  decodeURIComponent(r[2]); return null;
//      }
        
        //方法二
        //有#时不能使用此方法
		var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
		var r = window.location.search.substr(1).match(reg);
		if(r!=null)return  unescape(r[2]); return null;
	},
	
	/**
    * 判断是否含有非法字符
    * @param {Object} 字符串 str
    * @return {Object} boolean
    */
	judgeIllegalChar : function (str)
	{
		//注意与filterIllegalChar的正则不同
		var arr = str.split("");
	    var pattern=/[`~!@#\$%\^\&\*\(\)_\+<>\?:"\{\},\.\\\/;'\[\]]/im;
	    
	    for (var i=0; i<arr.length; i++) {
			if(pattern.test(arr[i]))
			{
				return false;
			}
		}
		return true;
	},
	
	/**
    * 判断是否含有中文
    * @param {Object} 字符串 str
    * @return {Object} boolean
    */
	judgeChinese : function (str)
	{
		var arr = str.split("");
			
		for (var i=0; i<arr.length; i++) {
			if(/^[\u4e00-\u9fa5]/.test(arr[i]))
			{
				return false;
			}
		}
		return true;
	},
	
	/**
    * 验证手机号码
    * @param {Object} 需要验证的手机号 phoneNum
    * @return {Object} boolean
    */
	judgePhoneNum : function (phoneNum)
	{
		if (!/^(13[0-9]|15[0-9]|17[0-9]|18[0-9])\d{8}$/i.test(phoneNum))
	    {
	    	return false;
	    }else{
	    	return true;
	    }
	},
	
	/**
    * 验证身份证号码
    * @param {Object} 需要验证的身份证号码 IdCardNum
    * @return {Object} boolean
    */
	judgeIdCardNum : function (IdCardNum)
	{
		// 身份证号码为15位或者18位，15位时全为数字，18位前17位为数字，最后一位是校验位，可能为数字或字符X  
		var reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;  
	   	if (reg.test(IdCardNum) === false)
	    {
	    	return false;
	    }else{
	    	return true;
	    }
	},
	
	/**
    * 验证邮箱
    * @param {Object} 需要验证的邮箱地址 email
    * @return {Object} boolean
    */
	judgeEmail : function (email)
	{
		var filter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
		if (filter.test(email))
	    {
	    	return false;
	    }else{
	    	return true;
	    }
	},
	
	/**
    * 验证必须是数字
    * @param {Object} 需要验证的字符串 val
    * @return {Object} boolean
    */
	judgeNumFor : function (val)
	{
		var reg = new RegExp("^[0-9]*$");  
    	if (!reg.test(val))
	    {
	    	return false;
	    }else{
	    	return true;
	    }
	},
	
	/**
    * 只含有数字、大小写字母、下划线
    * @param {Object} 需要验证的字符串 val
    * @return {Object} boolean
    */
	judgeNumLetterUnderline : function (val)
	{
		var reg = new RegExp("^[a-zA-Z0-9_]*$");  
    	if (!reg.test(val))
	    {
	    	return false;
	    }else{
	    	return true;
	    }
	},
	
	/**
    * 验证金额  数字开头数字结尾 不为负数且小数点后两位
    * @param {Object} 需要验证的金额 val
    * @return {Object} boolean
    */
	judgeMonSum : function (val)
	{
		var reg = new RegExp("(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)");  
	    if (!reg.test(val))
	    {
	    	return false;
	    }else{
	    	return true;
	    }
	},
	
	/**
    * 验证图片 gif/jpg/jpeg/png/GIF/JPG/PNG格式
    * @param {Object} 需要验证的文件名 str
    * @return {Object} boolean
    */
	judgeImage : function (str)
	{
		var reg = /^.*[^]\.(?:gif|jpg|jpeg|png|gif|jpeg)$/;  
	    if (!reg.test(str))
	    {
	    	return false;
	    }else{
	    	return true;
	    }
	},
	
	/**
    * 验证端口号
    * @param {Object} 需要验证的字符串 str
    * @return {Object} boolean
    */
	judgeIdPort : function (str)
	{
		var parten=/^(\d)+$/g;
    	if (parten.test(str)&&parseInt(str)<=65535&&parseInt(str)>=0)
	    {
	    	return false;
	    }else{
	    	return true;
	    }
	},
	
	/**
    * 转换性别
    * @param {Object} 性别码 sexCode
    * @return {Object} sexDesc
    */
	changeSexCodeToDec : function ()
	{
		var sexCode = Number(sexCode);
		var sexDesc = null;
		(sexCode == 0) ? (sexDesc = '女') : (sexDesc = '男');
		return sexDesc;
	},
	
	/**
    * 显示页面
    */
	showPage : function ()
	{
		//一般数据加载完成后用  需引入JQ或Zepto
		$("body").show();
	},
	
	
	/* ===================================================
	 * 非常用 类
	 * ===================================================
	 */
	/**
    * 检测浏览器中是否存在此插件（在IE中无效）
    * @param {Object} 插件名 name
    * @return {Object} boolean 存在插件返回true，否则返回false
    */
	hasPlugin : function (name) {
       	name = name.toLowerCase();
       	for (var i = 0; i < navigator.plugins.length; i++) {
           	if (navigator.plugins[i].name.toLowerCase().indexOf(name) > -1) {
               	return true;
           	}
       	}
       	return false;
	},
	
	/**
    * 检测IE中的插件
    * @param {Object} 插件名 name
    * @return {Object} boolean 存在插件返回true，否则返回false
    */
   	hasIEPlugin : function (name) {
       	try {
           	new ActiveXObject(name);
           	return true;
       	} catch (ex) {
           	return false;
       	}
   	},
	
   	/**
    * 计算到当前的天数
    * @param {Object} 时间戳 dateStr
    * @return {Object} days
    */
	calDays : function (dateStr)
	{
		if(isEmpty(dateStr)){
			return '0';
		}else{
			var today = new Date();
			
			var aTime = today.getTime()/1000;
			var bTime = parseInt(dateStr);
			
			var days = Math.ceil((bTime - aTime) / 60 / 60 / 24);
			
			if (days < 0) { days = 0; };
			
			return days;
		}
	},
   	
   	/**
    * 计算某天到当前的时间
    * @param {Object} 时间戳 dateStr
    * @return {Object} time
    */
   	calTimeBetweenDates : function (dateStr)
	{
		var timestamp = new Date().getTime();
		var df = Math.ceil((parseInt(timestamp) - parseInt(dateStr*1000))/1000);
		if (isEmpty(dateStr))
		{
			return 0;
		}else{
			return 24*3600 - df;
		}
	},
	
	/**
    * 计算过去了几天
    * @param {Object} 时间戳 dateStr
    * @return {Object} day
    * calTimeBetweenDates方法 加强版
    */
	calDaysLateToday : function (dateStr)
	{
		if(isEmpty(dateStr)){
			return '0';
		}else{
			var today = new Date();
			
			var aTime = today.getTime()/1000;
			var bTime = parseInt(dateStr);
			
			var days = Math.floor((aTime - bTime) / 60 / 60 / 24);
			return days;
		}
	},
	
	/**
    * 解析时间戳
    * @param {Object} timestamp 时间戳
    * @param {Object} onlyDate 日期 ： true 日期 + 时分秒 false
    * @return {Object} string
    */
	formatDate : function(timestamp, onlyDate)
	{
		var date = new Date(timestamp * 1000);
		var year = date.getFullYear();
		var month = date.getMonth() + 1;
		var day = date.getDate();
		var hour = date.getHours();
		var minute = date.getMinutes();
		var second = date.getSeconds();

		if (onlyDate)
		{
			return this.numberPrefix(4, year) + "-" + this.numberPrefix(2, month) + "-" + this.numberPrefix(2, day);
		}

		return this.numberPrefix(4, year) + "-" + this.numberPrefix(2, month) + "-" + this.numberPrefix(2, day) + " "
			+ this.numberPrefix(2, hour) + ":" + this.numberPrefix(2, minute);
	},
	
	/**
    * 解析时间戳 数字处理
    * @param {Object} size
    * @param {Object} num
    * @return {Object} num
    */
	numberPrefix : function (size, num)
	{
		var sLen = ('' + num).length;
		if (sLen >= size) 
		{
			return '' + num;
		}
		var preZero = (new Array(size)).join('0');

		return preZero.substring(0, size - sLen) + num;
	},
	
	/**
    * 获取当天日期
    * @param {Object} num
    * @return {Object} yy:mm:dd或yy-mm-dd
    */
	getNowFormatDate : function()
	{
		var date = new Date();
		
		var seperator1 = "-";
		var seperator2 = ":";
		
		var year = date.getFullYear();
		var monthValue = date.getMonth() + 1;
		var month = this.numberSet(monthValue);
		var day = this.numberSet(date.getDate());
		
		var currentdate = year + seperator1 + month + seperator1 + day;
		return currentdate
	},
	
	/**
    * 个位数字加0
    * @param {Object} num
    * @return {Object} num
    */
	numberSet : function(num)
	{
		if (num >= 1 && num <= 9) 
		{
	        num = "0" + num;
	    }
		
		return num;
	},
	
	/**
    * 深克隆
    * @param {Object} 字符串 source
    * @return {Object} result
    */
	deepCopy : function (source)
	{
		var result;
		(source instanceof Array) ? (result = []) : (result = {});
		
		for (var key in source) {
			result[key] = (typeof source[key]==='object') ? deepCopy(source[key]) : source[key];
		}    
		return result; 
	},
	
	/**
    * 验证form表单的方法
    * @param {Object} 需要验证的字符串 val
    * @return {Object} boolean
    */
	validateProperty : function (val)
	{
		if (val == undefined || val == "")
	    {
	    	return true;
	    }else{
	    	return false;
	    }
	},
	
	/**
    * 根据选择的星星数量得到文本
    * @param {Object} 星星数目 num
    * @return {Object} boolean
    */
	getDisplayTextBySelectedStarsNum : function (num)
	{
		var displayText = "";
		switch(num)
		{
			case 0 : 
				displayText = "糟糕";
				break;
			case 1 : 
				displayText = "很不满意";
				break;
			case 2 : 
				displayText = "不满意";
				break;
			case 3 : 
				displayText = "满意";
				break;
			case 4 : 
				displayText = "较满意";
				break;
			case 5 : 
				displayText = "很满意";
				break;	
		}
		return displayText;
	},
	
	/**
    * 根据银行卡号获得银行卡所属银行
    * @param {Object} 银行卡号 bankNo
    * @return {Object} boolean
    * 需要引入bankData.js
    */
	getBankNameByCardNo : function (bankNo)
	{
		var bankName = "";
		var cutedBankNo = bankNo.substr(0,6);
		for(var i = 0 ; i < bankInfoArr.length ; i ++)
		{
			if(equal(bankInfoArr[i].bin,cutedBankNo))
			{
				bankName = bankInfoArr[i].bankName;
				break;
			}
		}
		return bankName;
	},
	
	/**
    * 无刷新本页面滚动指定位置
    * @param {Object} 关键字id/name key
    * 此方法必须引入JQ zepto的animate 和 scrollTop问题 另有原生方法收藏
    */
	scrollToArea : function (key)
	{
		$("html, body").animate({  
            scrollTop : $('#' + key).offset().top + "px"
        }, { 
            duration: 500,  
            easing: "swing"  
        });
        return false;
        
        //页面滚动 140为头部高度115+间隔
        //$('html,body').animate({scrollTop:$(className).offset().top - 140}, 300);
	},
	
	/**
	 * 根据唯一KEY值获取obj数组的下标
	 * @param {Object} arr
	 * @param {Object} key
	 * @param {Object} value
	 */
	getObjArrIndexByKey : function(arr,key,value){
		for(var i = 0 ; i < arr.length ; i ++)
		{
			if(arr[i][key] == value)
			{
				return i;
			}
		}
	},
	
    /**
     * 处理服务器返回数据是否为空，是取默认，否则取服务器的数据
     * @param {Object} apiValue
     * @param {Object} defaultValue
     */
    getDefaultOrSelf : function(apiValue,defaultValue)
    {
    	if(this.isEmpty(apiValue))
    	{
    		return defaultValue;
    	}
    	else
    	{
    		return apiValue;
    	}
    },
    
    /**
     * 根据数组对象的属性来排序
     * @param {Object} propertyName
     * @param {Object} targetArr
     */
    createComparionFun : function (propertyName, targetArr) 
    {
		return function(object1,object2)
		{
			var value1 = object1[propertyName];
			var value2 = object2[propertyName];
			return value1 - value2 || targetArr.indexOf(object1) - targetArr.indexOf(object2);
		}
	},
	
	
	/* ===================================================
	 * 专用 App类
	 * 通过mnWebMain封装的方法及调用Android、IOS原生的方法
	 * ===================================================
	 */
	errPopUpModal : function (msg)
	{
		//<summary>错误消息弹框</summary>     
   		//<param name="msg" type="string">错误消息</param>
		mnWebMain.syncSetLocalStorage(storageKey.MSG_DES,msg);
		mnWebMain.popupModal(popUpModalPageUrl.POP_UP_ERR_PAGE_URL,function(data){});
	},
	
	goBack : function (domClass)
	{
		//<summary>登录界面返回按钮执行事件</summary>     
	    //<param name="domClass" type="string">class类名</param>
	    //使用jq 点击事件
		$(domClass).off('tap').on('tap',function(e){
			e.stopPropagation();
			mnWebMain.closeSelfViewController(0);
		});
	},
	
	isLoggedIn : function ()
	{
		//<summary>判断是否已登录</summary>
		//本地存储 一种获取方式 可以换成其他(如cookie)
		var token = mnWebMain.syncGetLocalStorage(storageKey.LOGIN_TOKEN);
		if (!isEmpty(token))
	    {
	    	return true;
	    }else{
	    	return false;
	    }
	},
	
	showLoading : function ()
	{
		//<summary>显示加载数据框</summary>     
		mnWebMain.showLoading(errParam.ON_LOADING_DATA);
	},

	hideLoading : function ()
	{
		//<summary>隐藏加载数据框</summary>     
		mnWebMain.closeLoading();
	},
	
	updateNavBarCorner : function (isHide, param)
	{
		//<summary>隐藏原生头部</summary> 
		var updateParam = 
		{
			"position" : 2,
			"index" : 0,
			"isHide" : isHide,
			"type" : 0 ,
			"param" : param,
		}
		mnWebMain.updateNavBarCorner(updateParam);
	},
	
	thirdShare : function (shateType, title, content, icon, url)
	{
		//<summary>第三方分享</summary> 
		//<param name="shareType" type="string">分享平台类型 1微信朋友2微信朋友圈3微博4短信</param>
		//<param name="title" type="string">分享标题</param>
		//<param name="content" type="string">分享基础内容</param>
		//<param name="icon" type="string">缩略图</param>
		//<param name="url" type="string">分享链接</param>
		
		var params = {};
		params.title = title;
		params.content = content;
		params.url = url;
		params.icon = icon;
		
		mnWebMain.shareInfo(shareType,params);
	},
	
	uploadData : function (reqUrl, pageIndex, pageSize, callBack)
	{
		//<summary>上拉加载方法</summary> 
		//<param name="reqUrl" type="string"></param>
		//<param name="pageIndex" type="string"> </param>
		//<param name="pageSize" type="string"></param>
		//<param name="callBack" type="string">回调函数</param>
		var param = {};
		param.startIndex = pageIndex;
		param.num = pageSize;
		
		jqHttpRequest.asyncHttpRequest(reqUrl,param,callBack);
	},
	
	replacePlainTextToLink : function (str, link)
	{
		//<summary>显示文字有连接</summary> 
		//查找关键字和显示高亮  点击有下载效果
		var newStr = "";
		if(!isEmpty(str))
		{
			newStr = '<a download = "'+ link +'">'+ str +'</a>';
		}
		
		return newStr;
	},
	
	setAlias : function (telephone)
	{
		//<summary>设置别名</summary> 
		mnWebMain.setAlias(telephone);
	},
	
	emptyAlias : function ()
	{
		//<summary>清空别名</summary> 
		mnWebMain.emptyAlias();
	},
	
	sendEmail : function (receiverEmail, title, content)
	{
		//<summary>发送邮件</summary> 
		//<param name="receiverEmail" type="string"></param>
		//<param name="title" type="string">标题</param>
		//<param name="content" type="string">内容</param>
		var param = {};
		param.email = receiverEmail;
		param.title = title;
		param.message = content;
		showLoading();
		jqHttpRequest.asyncHttpRequest(requestApiUrl.SEND_EMAIL,param,function(data){
			mnWebMain.showProgressDialog('发送成功');
			hideLoading();
		});
	},
	
	
	/* ===================================================
	 * 专用 WX类
	 * ===================================================
	 */
	/**
    * 判断微信浏览器
    * @return {Object} boolean
    */
	judgeWeChat : function ()
	{
		var ua = navigator.userAgent.toLowerCase();
		if (ua.match(/MicroMessenger/i) == "micromessenger")
	    {
	    	return false;
	    }else{
	    	return true;
	    }
	},
	
	/**
    * 解决微信localstrorage失效问题
    * 存cookie
    * @param {Object} c_name
    * @param {Object} value
    * @param {Object} expiredays
    */
	setCookie : function (c_name, value, expiredays)
	{
		var exdate=new Date()
		exdate.setDate(exdate.getDate()+expiredays)
		document.cookie=c_name+ "=" +escape(value)+((expiredays==null) ? "" : ";expires="+exdate.toGMTString())
	},
	
	/**
    * 解决微信localstrorage失效问题
    * 获取cookie
    * @param {Object} c_name
    */
	getCookie : function (c_name)
	{	
		if (document.cookie.length>0)
		{
			c_start=document.cookie.indexOf(c_name + "=")
		  	if (c_start!=-1)
			{ 
			c_start=c_start + c_name.length+1 
			c_end=document.cookie.indexOf(";",c_start)
			if (c_end==-1) c_end=document.cookie.length
			return unescape(document.cookie.substring(c_start,c_end))
			} 
		}
		return ""
	},
	
	/**
    * 修改微信title
    * @param {Object} 标题名 title
    * WX在页面加载时就决定了title，ng在后面无法修改，应在页面输出时设置
    */
	changeWxTitle : function (title)
	{
		document.title = title;
		var i = document.createElement('iframe');
		i.src = '//m.baidu.com/favicon.ico';
		i.style.display = 'none';
		i.onload = function ()
		{
			setTimeout(function ()
			{
				i.remove();
			},9);
		};
		document.body.appendChild(i);
	},
	
	/**
    * 监听返回事件
    * @param {Object} 本页面名,如index pageKey
    * 实现登录返回主菜单功能  history 若失效 请改直接使用history.relpaceState{} 替换历史记录
    */
	listenWxBack : function (pageKey)
	{
		window.addEventListener("popstate", function()
		{
			var pageUrl =  window.location.href;
			
			if(pageUrl.indexOf(pageKey) > -1)
			{
				WeixinJSBridge.call("closeWindow");
			}
			else
			{
				window.history.go(-1);
			}
		},false);
	},
	
};
